package tests;
import static org.junit.Assert.*;

import java.util.ArrayList;
import org.junit.Before;
import org.junit.Test;

import negocios.Grafo;
import negocios.Persona;

public class GrafoTest {
	
	private Grafo<Persona> g;
	private Persona juan;
	private Persona ana;
	private Persona oscar;
	private Persona luisa;
	private Persona maria;
	
	@Before
	public void iniciar(){
		
		g = new Grafo<Persona>();
		juan = new Persona ("Juan", "juan@yahoo.com", 25);
		ana = new Persona ("Anita", "Ana90@gmail.com",16);
		oscar = new Persona ("Oscar", "oscar@hotmail.com", 40);
		luisa = new Persona ("Luisa", "luisa@yahoo.com", 22);
		maria = new Persona ("Maria", "maria@gmail.com",33);
		g.agregarVertice(ana);
		g.agregarVertice(juan);
		g.agregarVertice(luisa);
		g.agregarVertice(oscar);
		g.agregarVertice(maria);
		
	}
	
	@Test
	public void AgrgarVerticeTest(){
		
		ArrayList<Persona> arr = new ArrayList<Persona>();
		arr.add(ana);
		arr.add(juan);
		arr.add(luisa);
		arr.add(oscar);
		arr.add(maria);
		
		assertTrue(g.todosLosVertices().equals(arr));
		assertTrue(g.getCantidadDeVertices()== 5);
		
	}
	
	@Test
	public void iesimoTest(){
		assertEquals(g.iesimoVertice(ana), 0);
		assertEquals(g.iesimoVertice(juan), 1);
		assertEquals(g.iesimoVertice(luisa), 2);
		assertEquals(g.iesimoVertice(oscar), 3);
		assertEquals(g.iesimoVertice(maria), 4);
	}
	
	@Test
	public void agregarAristaTest(){
		
		g.agregarArista(juan, ana);
		g.agregarArista(oscar, luisa);
		g.agregarArista(ana, oscar);
		g.agregarArista(oscar, juan);
		g.agregarArista(maria, oscar);
		g.agregarArista(luisa, ana);
		
		
		assertTrue(g.sonVecinos(ana, juan));
		assertTrue(g.sonVecinos(juan, ana));
		
		assertTrue(g.sonVecinos(oscar,luisa));
		assertTrue(g.sonVecinos(luisa, oscar));
		
		assertTrue(g.sonVecinos(ana, oscar));
		assertTrue(g.sonVecinos(oscar, ana));
		
		assertFalse(g.sonVecinos(juan, luisa));
		assertFalse(g.sonVecinos(luisa, juan));
		
		assertTrue(g.sonVecinos(oscar, juan ));
		assertTrue(g.sonVecinos(juan, oscar ));
		
		assertTrue(g.sonVecinos(ana, luisa ));
		assertTrue(g.sonVecinos(luisa, ana ));
		
		assertTrue(g.sonVecinos(maria, oscar ));
		assertTrue(g.sonVecinos(oscar,maria ));
		
		assertFalse(g.sonVecinos(maria, luisa ));
		assertFalse(g.sonVecinos(luisa, maria));
		
	}
	
	@Test
	public void gradoTest(){
		
		agregarAristaTest();
		assertEquals(2, g.grado(juan));
		assertEquals(3, g.grado(ana));
		assertEquals(2, g.grado(luisa));
		assertEquals(4, g.grado(oscar));
		assertEquals(1, g.grado(maria));
	}
	@Test
	public void borrarArista(){
	
		g.borrarArista(luisa, maria);
		g.borrarArista(maria, oscar);
		
		assertFalse(g.sonVecinos(luisa, maria));
		assertFalse(g.sonVecinos(maria, luisa));
		
		assertFalse(g.sonVecinos(oscar, maria));
		assertFalse(g.sonVecinos(maria, oscar));
		
	}
	
	@Test
	public void eliminarVerticeTest(){
		
		g.eliminarVertice(ana);
		
		assertTrue(g.getCantidadDeVertices()== 4);
		assertTrue(!g.pertenece(ana));
		
		
		assertTrue(!g.sonVecinos(ana, juan));
		assertTrue(!g.sonVecinos(juan, ana));
		assertTrue(!g.sonVecinos(ana, oscar));
		assertTrue(!g.sonVecinos(oscar, ana));
		assertTrue(!g.sonVecinos(ana, luisa ));
		assertTrue(!g.sonVecinos(luisa, ana ));
		
		g.eliminarVertice(maria);
		
		assertTrue(g.getCantidadDeVertices()== 3);
		assertTrue(!g.pertenece(maria));
		
		assertTrue(!g.sonVecinos(maria, oscar ));
		assertTrue(!g.sonVecinos(oscar,maria ));
		
	}
	
	@Test
	public void esConexo(){
		agregarAristaTest();
		assertFalse(g.esConexo(ana));
		assertFalse(g.esConexo(juan));
		assertFalse(g.esConexo(luisa));
		assertTrue(g.esConexo(oscar));
		assertFalse(g.esConexo(maria));
		
		
	}
	
	

}
